package ui.arena;

import org.uqbar.arena.actions.MessageSend;
import org.uqbar.arena.bindings.NotNullObservable;
import org.uqbar.arena.layout.ColumnLayout;
import org.uqbar.arena.layout.HorizontalLayout;
import org.uqbar.arena.widgets.Button;
import org.uqbar.arena.widgets.Label;
import org.uqbar.arena.widgets.Panel;
import org.uqbar.arena.widgets.TextBox;
import org.uqbar.arena.widgets.tables.Column;
import org.uqbar.arena.widgets.tables.Table;
import org.uqbar.arena.windows.SimpleWindow;
import org.uqbar.arena.windows.WindowOwner;
import org.uqbar.lacar.ui.model.TableBuilder;
import org.uqbar.lacar.ui.model.bindings.Binding;

import reservas.ClaseDeUsuarioNoPuedeReservarException;

import usuarios.CategoriaUsuarioVip;
import usuarios.Usuario;

import com.uqbar.commons.collections.Transformer;

import facade.AterrizarPuntoCom;

import asientos.CodigoDeAsientoInvalidoException;
import asientos.EstadoDeAsientoIncorrectoException;
import asientos.EstadosAsiento;
import asientos.Vuelo;

@SuppressWarnings("serial")
public class BusquedaWindow extends SimpleWindow<BusquedaModel> {

	public BusquedaWindow(WindowOwner parent) {
		super(parent, new BusquedaModel());
	}

	
	@Override
	protected void createMainTemplate(Panel mainPanel) {
		this.setTitle(TituloVentanas.getInstance().getTituloVentana());
		this.setTaskDescription("Ingrese los parámetros de búsqueda");

		super.createMainTemplate(mainPanel);
		this.createResultsGrid(mainPanel);
		this.createGridActions(mainPanel);
		

	}

	protected void createResultsGrid(Panel mainPanel) {
		Table<Vuelo> table = new Table<Vuelo>(mainPanel, Vuelo.class);
		table.setHeigth(200);
		table.setWidth(450);

		table.bindItemsToProperty("resultado");
		table.bindValueToProperty("vueloSeleccionado");		

		this.describeResultsGrid(table);
	}
	
	protected void describeResultsGrid(Table<Vuelo> table) {
		Column<Vuelo> aerolineaColumn = new Column<Vuelo>(table);
		aerolineaColumn.setTitle("Aerolinea");
		aerolineaColumn.setFixedSize(100);
		aerolineaColumn.bindContentsToProperty("aerolinea");
		
		Column<Vuelo> codVueloColumn = new Column<Vuelo>(table);
		codVueloColumn.setTitle("Codigo Vuelo");
		codVueloColumn.setFixedSize(150);
		codVueloColumn.bindContentsToProperty("codigoDeVuelo");

		Column<Vuelo> codAsientoColumn = new Column<Vuelo>(table);
		codAsientoColumn.setTitle("Codigo Asiento");
		codAsientoColumn.setFixedSize(120);
		codAsientoColumn.bindContentsToProperty("numeroDeAsiento");

		Column<Vuelo> precioColumn = new Column<Vuelo>(table);
		precioColumn.setTitle("Precio");
		precioColumn.setFixedSize(80);
		precioColumn.bindContentsToProperty("precio");
		
		Column<Vuelo> ubicacionColumn = new Column<Vuelo>(table);
		ubicacionColumn.setTitle("Ubicacion");
		ubicacionColumn.setFixedSize(100);
		ubicacionColumn.bindContentsToProperty("ubicacion");	
		
		Column<Vuelo> claseColumn = new Column<Vuelo>(table);
		claseColumn.setTitle("Clase");
		claseColumn.setFixedSize(100);
		claseColumn.bindContentsToTransformer(new ClaseDeAsientoToNombreDeClaseDeAsientoTransformer());
		
		
	}
	
	protected void createGridActions(Panel mainPanel) {
		Panel actionsPanel = new Panel(mainPanel);
		actionsPanel.setLayout(new HorizontalLayout());

		Button comprar = new Button(actionsPanel);
		comprar.setCaption("Comprar");
		comprar.onClick(new MessageSend(this, "comprarAsiento"));

		Button reservar = new Button(actionsPanel);
		reservar.setCaption("Reservar");
		reservar.onClick(new MessageSend(this, "reservarAsiento"));
		
		Button cerrar = new Button(actionsPanel);
		cerrar.setCaption("Cerrar");
		cerrar.onClick(new MessageSend(this, "close"));		
		
		NotNullObservable vueloSeleccionado = new NotNullObservable("vueloSeleccionado");
		comprar.bindEnabled(vueloSeleccionado);
		reservar.bindEnabled(vueloSeleccionado);
		
	}

	@Override
	protected void addActions(Panel actionsPanel) {
		new Button(actionsPanel)
		.setCaption("Buscar")
		.onClick(new MessageSend(this.getModelObject(), "buscar"))
		.setAsDefault()
		.disableOnError();
		
	}

	@Override
	protected void createFormPanel(Panel mainPanel) {
		Panel searchFormPanel = new Panel(mainPanel);
		searchFormPanel.setLayout(new ColumnLayout(4));
		
		new Label(searchFormPanel).setText("Origen: ");
		new TextBox(searchFormPanel).bindValueToProperty("origen");
		
		new Label(searchFormPanel).setText("Destino: ");
		new TextBox(searchFormPanel).bindValueToProperty("destino");

		new Label(searchFormPanel).setText("Fecha Salida (DD/MM/AAAA): ");
		new TextBox(searchFormPanel).bindValueToProperty("fechaSalida").setTransformer(new StringToFechaFormatoLatinoamericanoTransformer());
		
	}
	
	public void comprarAsiento(){		
		try{
			this.getModelObject().getVueloSeleccionado().comprar(Usuario.getInstance());
			new TransaccionOKWindow(this, new TransaccionOK("comprado",this.getModelObject().getVueloSeleccionado())).open();
		} catch(EstadoDeAsientoIncorrectoException e){			
			new TransaccionErrorWindow(this, new TransaccionError("compra", e.getDescripcionDelError())).open();						
		} catch (CodigoDeAsientoInvalidoException e){
			new TransaccionErrorWindow(this, new TransaccionError("compra", e.getDescripcionDelError())).open();					
		}				
	}
	
	
	public void reservarAsiento() {		
		try{
			AterrizarPuntoCom.getInstance().reservar(this.getModelObject().getVueloSeleccionado(), Usuario.getInstance());
			new TransaccionOKWindow(this, new TransaccionOK("reservado", this.getModelObject().getVueloSeleccionado())).open();			
		} catch(EstadoDeAsientoIncorrectoException e){
			if(this.getModelObject().getVueloSeleccionado().getEstado().equals(EstadosAsiento.RESERVADO)){
				new SobreReservaWindow(this, new SobreReserva(this.getModelObject().getVueloSeleccionado())).open();				
			} else {
				new TransaccionErrorWindow(this, new TransaccionError("reserva", e.getDescripcionDelError())).open();					
			}			
		} catch(CodigoDeAsientoInvalidoException e){
			new TransaccionErrorWindow(this, new TransaccionError("reserva", e.getDescripcionDelError())).open();			
		} catch (ClaseDeUsuarioNoPuedeReservarException e) {
			new TransaccionErrorWindow(this, new TransaccionError("reserva", e.getDescripcionDelError())).open();
		}
		
	}

}
